/* Fakemeta pev to engine wrapper for backwards compatibility.
*
* by the AMX Mod X Development Team
*
* This file is provided as is (no warranties).
*/

#if defined _fakemeta_pev_included
  #endinput
#endif
#define _fakemeta_pev_included

#include <engine>

enum {
	pev_string_start = 0,
	pev_classname,
	pev_globalname,
	pev_model,
	pev_target,
	pev_targetname,
	pev_netname,
	pev_message,
	pev_noise,
	pev_noise1,
	pev_noise2,
	pev_noise3,
	pev_string_end,
	pev_edict_start,
	pev_chain,
	pev_dmg_inflictor,
	pev_enemy,
	pev_aiment,
	pev_owner,
	pev_groundentity,
	pev_euser1,
	pev_euser2,
	pev_euser3,
	pev_euser4,
	pev_edict_end,
	pev_float_start,
	pev_impacttime,
	pev_starttime,
	pev_idealpitch,
	pev_ideal_yaw,
	pev_pitch_speed,
	pev_yaw_speed,
	pev_ltime,
	pev_nextthink,
	pev_gravity,
	pev_friction,
	pev_frame,
	pev_animtime,
	pev_framerate,
	pev_scale,
	pev_renderamt,
	pev_health,
	pev_frags,
	pev_takedamage,
	pev_max_health,
	pev_teleport_time,
	pev_armortype,
	pev_armorvalue,
	pev_dmg_take,
	pev_dmg_save,
	pev_dmg,
	pev_dmgtime,
	pev_speed,
	pev_air_finished,
	pev_pain_finished,
	pev_radsuit_finished,
	pev_maxspeed,
	pev_fov,
	pev_flFallVelocity,
	pev_fuser1,
	pev_fuser2,
	pev_fuser3,
	pev_fuser4,
	pev_float_end,
	pev_int_start,
	pev_fixangle,
	pev_modelindex,
	pev_viewmodel,
	pev_weaponmodel,
	pev_movetype,
	pev_solid,
	pev_skin,
	pev_body,
	pev_effects,
	pev_light_level,
	pev_sequence,
	pev_gaitsequence,
	pev_rendermode,
	pev_renderfx,
	pev_weapons,
	pev_deadflag,
	pev_button,
	pev_impulse,
	pev_spawnflags,
	pev_flags,
	pev_colormap,
	pev_team,
	pev_waterlevel,
	pev_watertype,
	pev_playerclass,
	pev_weaponanim,
	pev_pushmsec,
	pev_bInDuck,
	pev_flTimeStepSound,
	pev_flSwimTime,
	pev_flDuckTime,
	pev_iStepLeft,
	pev_gamestate,
	pev_oldbuttons,
	pev_groupinfo,
	pev_iuser1,
	pev_iuser2,
	pev_iuser3,
	pev_iuser4,
	pev_int_end,
	pev_byte_start,
	pev_controller_0,
	pev_controller_1,
	pev_controller_2,
	pev_controller_3,
	pev_blending_0,
	pev_blending_1,
	pev_byte_end,
	pev_bytearray_start,
	pev_controller,
	pev_blending,
	pev_bytearray_end,
	pev_vecarray_start,
	pev_origin,
	pev_oldorigin,
	pev_velocity,
	pev_basevelocity,
	pev_clbasevelocity,
	pev_movedir,
	pev_angles,
	pev_avelocity,
	pev_v_angle,
	pev_endpos,
	pev_startpos,
	pev_absmin,
	pev_absmax,
	pev_mins,
	pev_maxs,
	pev_size,
	pev_rendercolor,
	pev_view_ofs,
	pev_vuser1,
	pev_vuser2,
	pev_vuser3,
	pev_vuser4,
	pev_punchangle,
	pev_vecarray_end
};

new const _ENUMWRAPPER[pev_vecarray_end + 1] = {
	0,
	EV_SZ_classname,
	EV_SZ_globalname,
	EV_SZ_model,
	EV_SZ_target,
	EV_SZ_targetname,
	EV_SZ_netname,
	EV_SZ_message,
	EV_SZ_noise,
	EV_SZ_noise1,
	EV_SZ_noise2,
	EV_SZ_noise3,
	0,
	0,
	EV_ENT_chain,
	EV_ENT_dmg_inflictor,
	EV_ENT_enemy,
	EV_ENT_aiment,
	EV_ENT_owner,
	EV_ENT_groundentity,
	EV_ENT_euser1,
	EV_ENT_euser2,
	EV_ENT_euser3,
	EV_ENT_euser4,
	0,
	0,
	EV_FL_impacttime,
	EV_FL_starttime,
	EV_FL_idealpitch,
	EV_FL_ideal_yaw,
	EV_FL_pitch_speed,
	EV_FL_yaw_speed,
	EV_FL_ltime,
	EV_FL_nextthink,
	EV_FL_gravity,
	EV_FL_friction,
	EV_FL_frame,
	EV_FL_animtime,
	EV_FL_framerate,
	EV_FL_scale,
	EV_FL_renderamt,
	EV_FL_health,
	EV_FL_frags,
	EV_FL_takedamage,
	EV_FL_max_health,
	EV_FL_teleport_time,
	EV_FL_armortype,
	EV_FL_armorvalue,
	EV_FL_dmg_take,
	EV_FL_dmg_save,
	EV_FL_dmg,
	EV_FL_dmgtime,
	EV_FL_speed,
	EV_FL_air_finished,
	EV_FL_pain_finished,
	EV_FL_radsuit_finished,
	EV_FL_maxspeed,
	EV_FL_fov,
	EV_FL_flFallVelocity,
	EV_FL_fuser1,
	EV_FL_fuser2,
	EV_FL_fuser3,
	EV_FL_fuser4,
	0,
	0,
	EV_INT_fixangle,
	EV_INT_modelindex,
	-1, // pev_viewmodel
	-1, // pev_weaponmodel
	EV_INT_movetype,
	EV_INT_solid,
	EV_INT_skin,
	EV_INT_body,
	EV_INT_effects,
	EV_INT_light_level,
	EV_INT_sequence,
	EV_INT_gaitsequence,
	EV_INT_rendermode,
	EV_INT_renderfx,
	EV_INT_weapons,
	EV_INT_deadflag,
	EV_INT_button,
	EV_INT_impulse,
	EV_INT_spawnflags,
	EV_INT_flags,
	EV_INT_colormap,
	EV_INT_team,
	EV_INT_waterlevel,
	EV_INT_watertype,
	EV_INT_playerclass,
	EV_INT_weaponanim,
	EV_INT_pushmsec,
	EV_INT_bInDuck,
	EV_INT_flTimeStepSound,
	EV_INT_flSwimTime,
	EV_INT_flDuckTime,
	EV_INT_iStepLeft,
	EV_INT_gamestate,
	EV_INT_oldbuttons,
	EV_INT_groupinfo,
	EV_INT_iuser1,
	EV_INT_iuser2,
	EV_INT_iuser3,
	EV_INT_iuser4,
	0,
	0,
	EV_BYTE_controller1,
	EV_BYTE_controller2,
	EV_BYTE_controller3,
	EV_BYTE_controller4,
	EV_BYTE_blending1,
	EV_BYTE_blending2,
	0,
	0,
	-1, // bytearray controller
	-1, // bytearray blending
	0,
	0,
	EV_VEC_origin,
	EV_VEC_oldorigin,
	EV_VEC_velocity,
	EV_VEC_basevelocity,
	EV_VEC_clbasevelocity,
	EV_VEC_movedir,
	EV_VEC_angles,
	EV_VEC_avelocity,
	EV_VEC_v_angle,
	EV_VEC_endpos,
	EV_VEC_startpos,
	EV_VEC_absmin,
	EV_VEC_absmax,
	EV_VEC_mins,
	EV_VEC_maxs,
	EV_VEC_size,
	EV_VEC_rendercolor,
	EV_VEC_view_ofs,
	EV_VEC_vuser1,
	EV_VEC_vuser2,
	EV_VEC_vuser3,
	EV_VEC_vuser4,
	EV_VEC_punchangle,
	0,
}
stock pev(_index, _value, {Float, Sql, Result, _}:...) {
	if (_value > pev_string_start && _value < pev_string_end) {
		const BUFFERSIZE = 511
		new buffer[BUFFERSIZE + 1]
		if (!entity_get_string(_index, _ENUMWRAPPER[_value], buffer, getarg(3) < BUFFERSIZE ? getarg(3) : BUFFERSIZE))
			return 0

		new const STRLEN = strlen(buffer)
		new const MAXLEN = getarg(3)
		new i
		for (i = 0; i < STRLEN && i < MAXLEN && setarg(2, i, buffer[i]); i++) {}
		return setarg(2, i, '^0')
	}
	else if (_value > pev_edict_start && _value < pev_edict_end) {
		return entity_get_edict(_index, _ENUMWRAPPER[_value])
	}
	else if (_value > pev_float_start && _value < pev_float_end) {
		return setarg(2, 0, _:entity_get_float(_index, _ENUMWRAPPER[_value]))
	}
	else if (_value > pev_int_start && _value < pev_int_end) {
		return entity_get_int(_index, _ENUMWRAPPER[_value])
	}
	else if (_value > pev_byte_start && _value < pev_byte_end) {
		return entity_get_byte(_index, _ENUMWRAPPER[_value])
	}
	else if (_value > pev_vecarray_start && _value < pev_vecarray_end) {
		new Float:vector[3]
		entity_get_vector(_index, _ENUMWRAPPER[_value], vector)

		if (!setarg(2, 0, _:vector[0]) || !setarg(2, 1, _:vector[1]) || !setarg(2, 2, _:vector[2]))
			return 0

		return 1
	}
	else if (_value == pev_controller) {
		if (!setarg(2, 0, entity_get_byte(_index, EV_BYTE_controller1)) || setarg(2, 1, entity_get_byte(_index, EV_BYTE_controller2)) || setarg(2, 2, entity_get_byte(_index, EV_BYTE_controller3)) || setarg(2, 3, entity_get_byte(_index, EV_BYTE_controller4)))
			return 0
		return 1
	}
	else if (_value == pev_blending) {
		if (!setarg(2, 0, entity_get_byte(_index, EV_BYTE_blending1)) || setarg(2, 1, entity_get_byte(_index, EV_BYTE_blending2)))
			return 0
		return 1
	}

	return 0
}

stock set_pev(_index, _value, {Float, Sql, Result, _}:...) {
	if (_value > pev_string_start && _value < pev_string_end) {
		new string[512], i = 0
		do string[i] = getarg(2, i); while (string[i++] != '^0' && i < 512)
		return entity_set_string(_index, _ENUMWRAPPER[_value], string)
	}
	else if (_value > pev_edict_start && _value < pev_edict_end) {
		return entity_set_edict(_index, _ENUMWRAPPER[_value], getarg(2))
	}
	else if (_value > pev_float_start && _value < pev_float_end) {
		return entity_set_float(_index, _ENUMWRAPPER[_value], Float:getarg(2))
	}
	else if (_value > pev_int_start && _value < pev_int_end) {
		return entity_set_int(_index, _ENUMWRAPPER[_value], getarg(2))
	}
	else if (_value > pev_byte_start && _value < pev_byte_end) {
		return entity_set_byte(_index, _ENUMWRAPPER[_value], getarg(2))
	}
	else if (_value > pev_vecarray_start && _value < pev_vecarray_end) {
		new Float:vector[3]
		vector[0] = Float:getarg(2, 0); vector[1] = Float:getarg(2, 1); vector[2] = Float:getarg(2, 2);
		return entity_set_vector(_index, _ENUMWRAPPER[_value], vector)
	}
	else if (_value == pev_controller) {
		return entity_set_byte(_index, EV_BYTE_controller1, getarg(2, 0)) && entity_set_byte(_index, EV_BYTE_controller2, getarg(2, 1)) && entity_set_byte(_index, EV_BYTE_controller3, getarg(2, 2)) && entity_set_byte(_index, EV_BYTE_controller4, getarg(2, 3))
	}
	else if (_value == pev_blending) {
		return entity_set_byte(_index, EV_BYTE_blending1, getarg(2, 0)) && entity_set_byte(_index, EV_BYTE_blending2, getarg(2, 1))
	}

	return 0
}
